
<?php
require_once LIBRARIES_ENTITIES_CATEGORIES;
require_once LIBRARIES_ENTITIES_ARTICLES;
require_once LIBRARIES_ENTITIES_USERS;
require_once LIBRARIES_TOOLS_UTILITY;
require_once LIBRARIES_TOOLS_XTEMPLATE;
require_once LIBRARIES_TOOLS_PAGERBACKEND;

class ArticleController {

    //put your code here
    public function invoke() {

        // function list
        $groupFunctions = $_SESSION['groupFunctions'];

        // user login
        $userID = $_SESSION["session"]["sUserID"];


        // directory path
        $dir = dirname(__FILE__);


        // view
        $view = '';
        if (isset($_GET['view'])) {
            $view = $_GET['view'];
        }

        // action
        $action = '';
        if (isset($_POST['hdAction'])) {
            $action = $_POST['hdAction'];
        }


        // task
        $task = '';
        if (isset($_GET['task'])) {
            $task = $_GET['task'];
        }


        // line per page
        $rowToView = LINE_PER_PAGE;
        if (isset($_POST["limit"])) {
            $rowToView = $_POST["limit"];
        }


        // view article
        if ($view == 'article') {

            switch ($action) {
                case "publish":
                    $values = $_POST["cid"];
                    $result = $this->updateStatus($values, true);
                    break;
                case "unpublish":
                    $values = $_POST["cid"];
                    $result = $this->updateStatus($values, false);
                    break;
                case "highlight":
                    $values = $_POST["cid"];
                    $result = $this->updateHighLight($values, true);
                    break;
                case "unhighlight":
                    $values = $_POST["cid"];
                    $result = $this->updateHighLight($values, false);
                    break;
                case "orderdown":
                    $articleID = $_POST["hdArticleID"];
                    $result = $this->orderDownArticle($articleID);
                    break;
                case "orderup":
                    $articleID = $_POST["hdArticleID"];
                    $result = $this->orderUpArticle($articleID);
                    break;
                case "remove":
                    $values = $_POST["cid"];
                    $result = $this->deleteArticle($values);
                    if ($result == OK) {
                        Utility::messageBox('Xóa thành công');
                    }
                    break;
                case "add":
                case "addAndExit":
                    $title = $_POST['txtTitle'];
                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $content = Utility::replaceHtmlSpecialChars($_POST['txtContent']);
                    $modifiedDate = Utility::formatDateTime($_POST['createdDate']);
                    $image = $_POST['hdImage'];
                    $imageStatus = $_POST['rdoImageStatus'];
                    $categoryID = $_POST['slCategoryID'];
                    $status = $_POST['rdoStatus'];
                    $highlight = $_POST['rdoHighLight'];
                    $modifiedUserID = $userID;
                    $result = $this->addArticle($title, $alias, $categoryID, $modifiedDate, $image, $imageStatus, $description, $content, $modifiedUserID, $highlight, $status);
                    if ($result == OK) {
                        if ($action == 'add') {
                            Utility::messageBox('Thêm thành công');
                        } else {
                            Utility::redirect(".?com=com_article&view=article&task=view&categoryID=" . $_POST['slCategoryID'] . "");
                        }
                    }
                    break;
                case "edit":
                case "editAndExit":
                    $title = $_POST['txtTitle'];
                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $content = Utility::replaceHtmlSpecialChars($_POST['txtContent']);
                    $modifiedDate = Utility::formatDateTime($_POST['modifiedDate']);
                    $image = $_POST['hdImage'];
                    $imageStatus = $_POST['rdoImageStatus'];
                    $categoryID = $_POST['slCategoryID'];
                    $status = $_POST['rdoStatus'];
                    $highlight = $_POST['rdoHighLight'];
                    $modifiedUserID = $userID;
                    $ID = $_POST['hdArticleID'];

                    $result = $this->updateArticle($ID, $title, $alias, $categoryID, $modifiedDate, $image, $imageStatus, $description, $content, $modifiedUserID, $highlight, $status);

                    if ($result == OK) {
                        if ($action == 'edit') {
                            Utility::messageBox('Sửa thành công');
                        } else {
                            Utility::redirect(".?com=com_article&view=article&task=view&categoryID=" . $_POST['slCategoryID'] . "");
                        }
                    }
                    break;
            }




            if ($task == 'view') {

                // check view permission
                if (Utility::checkPermission('view', $groupFunctions, ARTICLE_MANAGEMENT)) {

                    $viewFile = $dir . '/views/article/article_list.html';
                    $xtemplate = new XTemplate($viewFile);

                    // CHECK PERMISSION
                    // check add button
                    if (Utility::checkPermission('add', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.add_button');
                    }
                    // check delete button
                    if (Utility::checkPermission('delete', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.delete_button');
                    }
                    // check enable button
                    if (Utility::checkPermission('enable', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.enable_button');
                    }
                    // check disable button
                    if (Utility::checkPermission('disable', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.disable_button');
                    }
                    // check highlight button
                    if (Utility::checkPermission('highlight', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.highlight_button');
                    }
                    // check un-highlight button
                    if (Utility::checkPermission('unhighlight', $groupFunctions, ARTICLE_MANAGEMENT)) {
                        $xtemplate->parse('main.unhighlight_button');
                    }


                    // mã nhóm tin muốn hiển thị
                    $categoryID = 0;
                    if (isset($_POST['slCategoryID'])) {
                        $categoryID = $_POST['slCategoryID'];
                    } else if (isset($_GET['categoryID'])) {
                        $categoryID = $_GET['categoryID'];
                    }

                    // chỉ mục của checkbox
                    $indexCheckBox = 1;

                    // page hiện tại đang xem
                    $rurrentPage = 1;
                    if (isset($_POST["page"])) {
                        $rurrentPage = $_POST["page"];
                    }


                    // chỉ mục (số thứ tự của bài viết) bài viết
                    $index = 1;


                    // in danh sách category
                    $this->printCategoryList($xtemplate);




                    // nếu có chọn category từ danh sách thì gán vào biến selectedcategoryID
                    // biến này dùng để truyền qua form thêm
                    if (isset($_POST['slCategoryID'])) {
                        $xtemplate->assign('SELECTED_CATEGORY_ID', $_POST['slCategoryID']);
                    } else {
                        $xtemplate->assign('SELECTED_CATEGORY_ID', 0);
                    }


                    // tải danh sách bài viết
                    $articles = $this->getArticleListByCategoryID($categoryID);


                    // tải đối tượng phân trang
                    $pager = PagerBackEnd::getPagerData(count($articles), $rowToView, $rurrentPage);



                    if ($articles != null) {
                        $indexCheckBox = 1;
                        // in danh sách bài viết
                        foreach ($articles as $article) {

                            if ($index > $pager->offset && $index <= $pager->limit) {

                                $xtemplate->assign('INDEX', $index);

                                $xtemplate->assign('INDEX_CHECKBOX', $indexCheckBox);

                                $xtemplate->assign('ARTICLE_ID', $article->getID());
                                $xtemplate->assign('ARTICLE_IMAGE', $article->getImage());
                                $xtemplate->assign('ARTICLE_TITLE', $article->getTitle());
                                $xtemplate->assign('CREATED_USER', $article->getCreatedUser()->getFullname());
                                $xtemplate->assign('MODIFIED_USER', $article->getModifiedUser()->getFullname());

                                $xtemplate->assign('CREATED_DATE', $article->getCreatedDate());
                                $xtemplate->assign('MODIFIED_DATE', $article->getModifiedDate());
                                $xtemplate->assign('HITS', $article->getHits());

                                // focus
                                if ($article->getHighLight() == 1) {
                                    $xtemplate->assign('HIGHLIGHT_ACTION', 'unhighlight');
                                    $xtemplate->assign('HIGHLIGHT_IMAGE', 'highlight.png');
                                } else {
                                    $xtemplate->assign('HIGHLIGHT_ACTION', 'highlight');
                                    $xtemplate->assign('HIGHLIGHT_IMAGE', 'unhighlight.png');
                                }

                                // check update permission                            
                                if (Utility::checkPermission('update', $groupFunctions, ARTICLE_MANAGEMENT)) {
                                    $xtemplate->parse('main.article_list.update_button');
                                } else {
                                    $xtemplate->parse('main.article_list.update_button_disable');
                                }


                                // status
                                if ($article->getStatus() == 1) {
                                    $xtemplate->assign('STATUS_ACTION', 'unpublish');
                                    $xtemplate->assign('STATUS_IMAGE', 'publish_g.png');
                                } else {
                                    $xtemplate->assign('STATUS_ACTION', 'publish');
                                    $xtemplate->assign('STATUS_IMAGE', 'publish_r.png');
                                }



                                // order
                                // nếu là dòng đầu thì hiển thị mũi tên xuống
                                if ($index == 1) {
                                    $xtemplate->parse('main.article_list.down_arrow');
                                }
                                // nếu là dòng cuối thì hiển thị mũi tên lên
                                else if ($index == count($articles)) {
                                    $xtemplate->parse('main.article_list.up_arrow');
                                }
                                // ngược lại thì hiển thị cả 2 mũi tên
                                else {
                                    $xtemplate->parse('main.article_list.up_down_arrow');
                                }

                                $xtemplate->parse('main.article_list');

                                $indexCheckBox++;
                            }
                            $index++;
                        }
                    }

                    // danh sách chọn số dòng hiển thị
                    $xtemplate->assign('LIMIT_LIST', Utility::getLimitList($rowToView));

                    // tổng số dòng hiển thị
                    $xtemplate->assign('ROW_TO_VIEW', $rowToView);

                    // trang hiện tại
                    $xtemplate->assign('CURRENT_PAGE', $rurrentPage);

                    // tổng số trang có được
                    $xtemplate->assign('AMOUNT_OF_PAGE', $pager->numPages);

                    // định dạng phân trang html
                    $xtemplate->assign('PAGING_HTML', $pager->paging);


                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else {
                    echo ERROR_PERMISSION;
                }
            }
            // nếu task là add thì include trang thêm vào
            else if ($task == 'add') {
                // check add permission
                if (Utility::checkPermission('add', $groupFunctions, ARTICLE_MANAGEMENT)) {
                    $xtemplate = new XTemplate($dir . DS . 'views' . DS . 'article' . DS . 'article_add.html');
                    $this->printCategoryList($xtemplate);
                    $xtemplate->assign('TODAY', date('d/m/Y'));
                    $xtemplate->assign('UPLOAD_FOLDER', UPLOAD_FOLDER);
                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else {
                    echo ERROR_PERMISSION;
                }
            }
            // nếu task là edit thì include trang thêm vào
            else if ($task == 'edit') {

                // check update permission
                if (Utility::checkPermission('update', $groupFunctions, ARTICLE_MANAGEMENT)) {

                    // articleID
                    $articleID = '';
                    if (isset($_GET['articleID'])) {
                        $articleID = $_GET['articleID'];
                    }
                    // get article detail by ID
                    $article = $this->getArticleByID($articleID);

                    // if article detail not null
                    if ($article != null) {
                        $xtemplate = new XTemplate(ADMIN_COM . DS . 'com_article' . DS . 'views' . DS . 'article' . DS . 'article_edit.html');

                        // in ra danh sách category
                        $this->printCategoryList($xtemplate, $article->getCategoryID());

                        // ngày tạo
                        $xtemplate->assign('MODIFIED_DATE', $article->getModifiedDate());

                        // tiêu đề
                        $xtemplate->assign('TITLE', $article->getTitle());

                        // hình ảnh
                        $xtemplate->assign('IMAGE', $article->getImage());

                        // alias
                        $xtemplate->assign('ALIAS', $article->getAlias());

                        // mô tả
                        $xtemplate->assign('DESCRIPTION', $article->getDescription());

                        // nội dung
                        $xtemplate->assign('CONTENT', $article->getContent());


                        // mã bài viết
                        $xtemplate->assign('ARTICLE_ID', $article->getID());

                        // trạng thái ảnh
                        if ($article->getImageStatus() == 1) {
                            $xtemplate->parse('main.image_status_true');
                        } else {
                            $xtemplate->parse('main.image_status_false');
                        }

                        // trạng thái bài viết
                        if ($article->getStatus() == 1) {
                            $xtemplate->parse('main.status_true');
                        } else {
                            $xtemplate->parse('main.status_false');
                        }

                        // trạng thái hightlight
                        if ($article->getHighLight() == 1) {
                            $xtemplate->parse('main.highlight_true');
                        } else {
                            $xtemplate->parse('main.highlight_false');
                        }



                        $xtemplate->parse('main');
                        $xtemplate->out('main');
                    } else {
                        Utility::redirect('.?com=com_content&view=news&task=view');
                    }
                } else {
                    echo ERROR_PERMISSION;
                }
            }
        }
        // view category
        else if ($view == 'category') {

            switch ($action) {
                case 'publish':
                    $values = $_POST["cid"];
                    $result = $this->updateStateCategory($values, true);
                    break;
                case 'unpublish':
                    $values = $_POST["cid"];
                    $result = $this->updateStateCategory($values, false);
                    break;
                case 'orderdown':
                    $categoryID = $_POST["hdCategoryID"];
                    $result = $this->orderCategory($categoryID, 'down');
                    break;
                case 'orderup':
                    $categoryID = $_POST["hdCategoryID"];
                    $result = $this->orderCategory($categoryID, 'up');
                    break;
                case 'remove':
                    $values = $_POST["cid"];
                    $result = $this->deleteCategory($values);
                    if ($result == OK) {
                        Utility::messageBox('Xóa thành công');
                        Utility::redirectCurrentPage();
                    }
                    break;
                case 'add':
                case 'addAndExit':

                    $title = $_POST['txtTitle'];

                    $image = $_POST['hdImage'];

                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $parent = $_POST['parentID'];
                    $createdDate = Utility::formatDateTime($_POST['createdDate']);
                    $status = $_POST['rdoState'];
                    $createdUserID = $userID;

                    $result = $this->addCategory($parent, $title, $alias, $createdDate, $description, $createdUserID, $status, $image);


                    if ($result == OK) {
                        if ($action == 'add') {
                            Utility::messageBox('Thêm thành công');
                            Utility::redirectCurrentPage();
                        } else {
                            Utility::redirect(".?com=com_article&view=category&task=view");
                        }
                    }
                    break;
                case 'edit':
                case 'editAndExit':

                    $categoryID = $_POST['hdCategoryID'];
                    $title = $_POST['txtTitle'];
                    $image = $_POST['hdImage'];

                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $parent = $_POST['slParentID'];
                    $createdDate = Utility::formatDateTime($_POST['createdDate']);
                    $status = $_POST['rdoState'];
                    $createdUserID = $userID;

                    $result = $this->updateCategory($parent, $title, $alias, $createdDate, $description, $createdUserID, $status, $categoryID, $image);

                    if ($result == OK) {
                        if ($action == 'edit') {
                            Utility::messageBox('Sửa thành công');
                        } else {
                            Utility::redirect(".?com=com_article&view=category&task=view");
                        }
                    }
                    break;
            }








            // view
            if ($task == 'view') {

                // check view permission
                if (Utility::checkPermission('view', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {

                    $viewFile = $dir . DS . 'views' . DS . 'category' . DS . 'category_list.html';
                    $xtemplate = new XTemplate($viewFile);

                    // CHECK PERMISSION
                    // check add button
                    if (Utility::checkPermission('add', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                        $xtemplate->parse('main.add_button');
                    }
                    // check delete button
                    if (Utility::checkPermission('delete', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                        $xtemplate->parse('main.delete_button');
                    }
                    // check enable button
                    if (Utility::checkPermission('enable', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                        $xtemplate->parse('main.enable_button');
                    }
                    // check disable button
                    if (Utility::checkPermission('disable', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                        $xtemplate->parse('main.disable_button');
                    }




                    // mã nhóm tin muốn hiển thị
                    $categoryID = 0;
                    if (isset($_POST['slCategoryID'])) {
                        $categoryID = $_POST['slCategoryID'];
                    } else if (isset($_GET['categoryID'])) {
                        $categoryID = $_GET['categoryID'];
                    }

                    // chỉ mục của checkbox
                    $indexCheckBox = 1;

                    // page hiện tại đang xem
                    $rurrentPage = 1;
                    if (isset($_POST["page"])) {
                        $rurrentPage = $_POST["page"];
                    }


                    // chỉ mục (số thứ tự của bài viết) bài viết
                    $index = 1;



                    // tải danh sách chủ đề
                    $categories = $this->getCategoryObjectListByComponentID(0);

                    // tải đối tượng phân trang
                    $pager = PagerBackEnd::getPagerData(count($categories), $rowToView, $rurrentPage);

                    if ($categories != null) {

                        $indexCheckBox = 1;

                        for ($i = 0; $i < count($categories); $i++) {

                            if ($index > $pager->offset && $index <= $pager->limit) {

                                $xtemplate->assign('INDEX', $index);
                                $xtemplate->assign('INDEX_CHECKBOX', $indexCheckBox);
                                $xtemplate->assign('CATEGORY_ID', $categories[$i]->getID());
                                $xtemplate->assign('CATEGORY_TITLE', $categories[$i]->getTitle());
                                $xtemplate->assign('CREATED_USER', $categories[$i]->getCreateUser()->getFullname());
                                $xtemplate->assign('MODIFIED_USER', $categories[$i]->getModifiedUser()->getFullname());
                                $xtemplate->assign('CREATED_DATE', $categories[$i]->getCreatedDate());
                                $xtemplate->assign('MODIFIED_DATE', $categories[$i]->getModifiedDate());
                                $xtemplate->assign('CATEGORY_ORDER', $categories[$i]->getOrder());

                                // check update permission                            
                                if (Utility::checkPermission('update', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                                    $xtemplate->parse('main.category_list.update_button');
                                } else {
                                    $xtemplate->parse('main.category_list.update_button_disable');
                                }


                                // status
                                if ($categories[$i]->getState() == 1) {
                                    $xtemplate->assign('STATUS_ACTION', 'unpublish');
                                    $xtemplate->assign('STATUS_IMAGE', 'publish_g.png');
                                } else {
                                    $xtemplate->assign('STATUS_ACTION', 'publish');
                                    $xtemplate->assign('STATUS_IMAGE', 'publish_r.png');
                                }



                                // order
                                // nếu là dòng đầu thì hiển thị mũi tên xuống
                                if ($index == 1) {
                                    $xtemplate->parse('main.category_list.down_arrow');
                                }
                                // nếu là dòng cuối thì hiển thị mũi tên lên
                                else if ($index == count($categories)) {
                                    $xtemplate->parse('main.category_list.up_arrow');
                                }
                                // ngược lại thì hiển thị cả 2 mũi tên
                                else {
                                    $xtemplate->parse('main.category_list.up_down_arrow');
                                }

                                $xtemplate->parse('main.category_list');

                                $indexCheckBox++;
                            }
                            $index++;
                        }

                        $xtemplate->assign('LIMIT_LIST', Utility::getLimitList($rowToView));
                        $xtemplate->assign('ROW_TO_VIEW', $rowToView);
                        $xtemplate->assign('CURRENT_PAGE', $rurrentPage);
                        $xtemplate->assign('AMOUNT_OF_PAGE', $pager->numPages);
                        $xtemplate->assign('PAGING_HTML', $pager->paging);
                    }
                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else {
                    echo ERROR_PERMISSION;
                }
            } else if ($task == 'add') {
                // check add permission
                if (Utility::checkPermission('add', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                    $xtemplate = new XTemplate($dir . DS . 'views' . DS . 'category' . DS . 'category_add.html');

                    // print category list
                    $this->printCategoryList($xtemplate);

                    $xtemplate->assign('TODAY', date('d/m/Y'));
                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else {
                    echo ERROR_PERMISSION;
                }
            } else if ($task == 'edit') {

                // check edit permission
                if (Utility::checkPermission('update', $groupFunctions, ARTICLE_CATEGORY_MANAGEMENT)) {
                    // mã nhóm
                    $categoryID = '';
                    if (isset($_GET['categoryID'])) {
                        $categoryID = $_GET['categoryID'];
                    }

                    // tải chi tiết category

                    $category = $this->getCategoryByID($categoryID);


                    // nếu có tồn tại bài viết có mã như trên thì hiển thị
                    // ngược lại quay về trang danh sách
                    if ($category != null) {

                        $xtemplate = new XTemplate($dir . DS . 'views' . DS . 'category' . DS . 'category_edit.html');

                        // in ra danh sách category
                        // truyền vào mã cha (mã  nhóm bài viết sẽ được chọn mặc định)
                        $this->printCategoryList($xtemplate, $category->getParent());

                        // ngày tạo
                        $xtemplate->assign('CATEGORY_MODIFIED_DATE', $category->getModifiedDate());

                        // tiêu đề
                        $xtemplate->assign('CATEGORY_TITLE', $category->getTitle());

                        // ảnh đại diện
                        $xtemplate->assign('CATEGORY_IMAGE', $category->getImage());

                        // alias
                        $xtemplate->assign('CATEGORY_ALIAS', $category->getAlias());

                        // mô tả
                        $xtemplate->assign('CATEGORY_DESCRIPTION', $category->getDescription());


                        // mã bài viết
                        $xtemplate->assign('CATEGORY_ID', $category->getID());


                        // trạng thái bài viết
                        if ($category->getState() == 1) {
                            $xtemplate->parse('main.state_true');
                        } else {
                            $xtemplate->parse('main.state_false');
                        }

                        $xtemplate->parse('main');
                        $xtemplate->out('main');
                    } else {
                        Utility::redirect('.?com=com_content&view=category&task=view');
                    }
                } else {
                    echo ERROR_PERMISSION;
                }
            }
        }
        // ngược lại thì quay về trang chủ
        else {
            Utility::redirect('.');
        }
    }

    // tải danh sách bài viết theo mã chủ đề
    public function getArticleListByCategoryID($categoryID) {
        try {

            $db = new Database();
            $article = new Articles();

            // nếu mã chủ đề là 0 thì tải hết danh sách
            // ngược lại tải danh sách bài viết thuộc chủ đề
            if ($categoryID == 0) {
                return $article->getList($db);
            } else {
                $article->setCategoryID($categoryID);
                return $article->getListByCategoryID($db);
            }
        } catch (PDOException $exc) {
            echo "getArticleList error: " . $exc->getMessage();
        }
    }

    // tải danh sách chủ đề (category) theo mã thành phần (component)
    // thành phần này là thành phần bài viết có mã là 2
    private function getCategoryListByComponentID($parentID = 0, $space = '&nbsp;&nbsp;', $trees = NULL) {
        try {
            if (!$trees) {
                $trees = array();
            }
            // mở kết nối
            $db = new Database();
            $category = new Categories();
            $category->setComponentID(2); // mã thành phần bài viết
            $category->setParent($parentID);
            $result = $category->getListByParentIDAndComponentID($db);

            $db->submitChanges();

            if ($result != null) {

                $k = 1;

                foreach ($result as $row) {

                    $trees[] = array('categoryID' => $row->getID(),
                        'k' => $k++,
                        'space' => $space,
                        'categoryTitle' => $space . $row->getTitle()
                    );

                    $trees = $this->getCategoryListByComponentID($row->getID(), $space . '_|__&nbsp;', $trees);
                }
            }
            return $trees;
        } catch (PDOException $exc) {
            echo "getCategoryListByComponentID error: " . $exc->getMessage();
        }
    }

    // tải danh sách chủ đề (category) theo mã thành phần (component)
    // thành phần này là thành phần bài viết có mã là 2
    private function getCategoryObjectListByComponentID($parentID = 0, $space = '&nbsp;&nbsp;', $rows = null) {
        try {

            if (!$rows) {
                $rows = array();
            }
            // mở kết nối
            $db = new Database();
            $category = new Categories();
            $category->setComponentID(2); // mã thành phần bài viết
            $category->setParent($parentID);
            $result = $category->getListByParentIDAndComponentID($db);
            $db->submitChanges();

            if ($result != null) {
                for ($i = 0; $i < count($result); $i++) {
                    $result[$i]->setTitle($space . $result[$i]->getTitle());
                    $rows[] = $result[$i];

                    $rows = $this->getCategoryObjectListByComponentID($result[$i]->getID(), $space . '_|__&nbsp;', $rows);
                }
            }
            return $rows;
        } catch (PDOException $exc) {
            echo "getCategoryListByComponentID error: " . $exc->getMessage();
        }
    }

    // hàm cập nhật trạng thái bài viết
    private function updateStatus($values, $status) {

        try {
            $db = new Database();
            for ($i = 0; $i < count($values); $i++) {
                $article = new Articles();
                $article->setID($values[$i]);
                if ($status == true) {
                    $article->setStatus(1);
                } else {
                    $article->setStatus(0);
                }
                $article->updateStatus($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm cập nhật trạng thái bài viết
    private function updateStateCategory($values, $status) {

        try {
            $db = new Database();
            for ($i = 0; $i < count($values); $i++) {
                $category = new Categories();
                $category->setID($values[$i]);
                if ($status == true) {
                    $category->setState(1);
                } else {
                    $category->setState(0);
                }
                $category->updateState($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm cập nhật highlight bài viết
    private function updateHighLight($values, $status) {
        try {
            $db = new Database();
            for ($i = 0; $i < count($values); $i++) {
                $article = new Articles();
                $article->setID($values[$i]);
                if ($status == true) {
                    $article->setHighLight(1);
                } else {
                    $article->setHighLight(0);
                }
                $article->updateHighLight($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm cập nhật highlight bài viết
    private function deleteArticle($values) {
        $db = new Database();
        try {
            for ($i = 0; $i < count($values); $i++) {
                $article = new Articles();
                $article->setID($values[$i]);
                $article->delete($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            $db->rollback();
            exit();
        }
    }

    // hàm thêm 1 bài viết
    private function addArticle($title, $alias, $categoryID, $createdDate, $image, $imageStatus, $description, $content, $createdUserID, $highlight, $status) {
        try {
            $db = new Database();

            $article = new Articles();

            $article->setTitle($title);
            $article->setAlias($alias);
            $article->setCategoryID($categoryID);
            $article->setCreatedDate($createdDate);
            $article->setModifiedDate($createdDate);
            $article->setCreatedUserID($createdUserID);
            $article->setModifiedUserID($createdUserID);
            $article->setImage($image);
            $article->setImageStatus($imageStatus);
            $article->setDescription($description);
            $article->setContent($content);
            $article->setHighLight($highlight);
            $article->setHits(0);
            $article->setStatus($status);
            $article->setOrder($article->getMaxOrder($db));
            $article->add($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm thêm 1 bài viết
    private function updateArticle($ID, $title, $alias, $categoryID, $modifiedDate, $image, $imageStatus, $description, $content, $modifiedUserID, $highlight, $status) {
        try {
            $db = new Database();
            $article = new Articles();
            $article->setID($ID);
            $article->setTitle($title);
            $article->setAlias($alias);
            $article->setCategoryID($categoryID);
            $article->setModifiedDate($modifiedDate);
            $article->setModifiedUserID($modifiedUserID);
            $article->setImage($image);
            $article->setImageStatus($imageStatus);
            $article->setDescription($description);
            $article->setContent($content);
            $article->setHighLight($highlight);
            $article->setStatus($status);
            $article->update($db);

            $db->submitChanges();

            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm thêm 1 bài viết
    private function addCategory($parent, $title, $alias, $createdDate, $description, $createdUserID, $status, $image) {
        try {

            $db = new Database();

            $category = new Categories();

            // id cha
            $category->setParent($parent);

            // tieu de
            $category->setTitle($title);
            // alias
            $category->setAlias($alias);

            // ngay tao
            $category->setCreatedDate($createdDate);
            // ngay cap nhat
            $category->setModifiedDate($createdDate);

            // nguoi tao
            $category->setCreatedUserID($createdUserID);
            // nguoi cap nhat
            $category->setModifiedUserID($createdUserID);

            // mo ta
            $category->setDescription($description);

            // trang thai
            $category->setState($status);


            $category->setImage($image);

            // cap bac
            $category->setLevel($category->getNextLevelByParentID($db));
            // ma thanh phan
            $category->setComponentID(2); // thành phần là bài viết
            // thu tu
            $category->setOrder($category->getMaxOrder($db));

            // them category
            $result = $category->add($db);

            $db->submitChanges();
            if ($result > 0) {
                return OK;
            } else {
                
            }
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm cập nhật 1 bài viết
    private function updateCategory($parent, $title, $alias, $createdDate, $description, $createdUserID, $status, $ID, $image) {
        try {

            $db = new Database();

            $category = new Categories();

            // id cha
            $category->setID($ID);

            // id cha
            $category->setParent($parent);

            // tieu de
            $category->setTitle($title);

            // alias
            $category->setAlias($alias);

            // ngay cap nhat
            $category->setModifiedDate($createdDate);

            // nguoi cap nhat
            $category->setModifiedUserID($createdUserID);

            // mo ta
            $category->setDescription($description);

            // trang thai
            $category->setState($status);

            // hình ảnh
            $category->setImage($image);

            // cap bac
            $category->setLevel($category->getNextLevelByParentID($db));


            // them category
            $result = $category->update($db);

            $db->submitChanges();
            if ($result > 0) {
                return OK;
            } else {
                
            }
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // delete a category
    private function deleteCategory($values) {
        try {
            $db = new Database();
            for ($i = 0; $i < count($values); $i++) {
                $category = new Categories();
                $category->setID($values[$i]);
                $category->delete($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm tải chi tiết 1 category
    private function getCategoryByID($categoryID) {
        try {
            $db = new Database();
            $category = new Categories();
            $category->setID($categoryID);
            $category = $category->getByID($db);
            $db->submitChanges();
            return $category;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // hàm thêm 1 bài viết
    private function getArticleByID($articleID) {
        try {
            $db = new Database();

            $article = new Articles();
            $article->setID($articleID);
            $article = $article->getByID($db);
            $db->submitChanges();
            return $article;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // giảm thứ tự bài viết
    private function orderDownArticle($articleID) {
        try {
            $db = new Database();
            $article = new Articles();
            $article->setID($articleID);
            $article->orderDown($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // tăng thứ tự bài viết
    private function orderUpArticle($articleID) {
        try {
            $db = new Database();
            $article = new Articles();
            $article->setID($articleID);
            $article->orderUp($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // order category
    private function orderCategory($categoryID, $action) {
        try {
            $db = new Database();
            $category = new Categories();
            $category->setID($categoryID);
            $categoryLevel = $category->getByID($db);
            $category->setComponentID(2); // article category
            $category->setLevel($categoryLevel->getLevel());

            if ($action == 'up') {
                $category->orderUp($db);
            } else {
                $category->orderDown($db);
            }
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    // in ra danh sách category
    private function printCategoryList($xtemplate, $parentID = null) {
        // tải danh sách nhóm tin
        $categories = $this->getCategoryObjectListByComponentID(0);

        // in ra danh sách chủ đề bài viết
        foreach ($categories as $category) {
            $xtemplate->assign('CATEGORY_ID', $category->getID());
            $xtemplate->assign('CATEGORY_TITLE', $category->getTitle());


            // nếu có tham số parentID truyền vào
            if ($parentID != null) {
                // nếu có biến get categoryID 
                // (tức là từ form thêm hay form edit trả về)
                if ($parentID == $category->getID()) {
                    $xtemplate->assign('SELECTED_CATEGORY', 'selected');
                } else {
                    $xtemplate->assign('SELECTED_CATEGORY', '');
                }
            } else {
                if (isset($_POST['slCategoryID'])) {
                    // nếu có biến post categoryID 
                    // (tức là có chọn thì hiển thị lại cái đã chọn trong danh sách)
                    if ($_POST['slCategoryID'] == $category->getID()) {
                        $xtemplate->assign('SELECTED_CATEGORY', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_CATEGORY', '');
                    }
                } else if (isset($_GET['categoryID'])) {
                    // nếu có biến get categoryID 
                    // (tức là từ form thêm hay form edit trả về)
                    if ($_GET['categoryID'] == $category->getID()) {
                        $xtemplate->assign('SELECTED_CATEGORY', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_CATEGORY', '');
                    }
                } else {
                    $xtemplate->assign('SELECTED_CATEGORY', '');
                }
            }
            $xtemplate->parse('main.category_list');
        }
    }

}
?>
